﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BankingSystem.BLL
{
    /// <summary>
    /// Класс "Банк"
    /// </summary>
    public class Bank
    {
        /// <summary>
        /// Счётчик банков (используется при генерации ID счёта)
        /// </summary>
        protected static int _id = 0;

        private string _name;

        // типы счётов при переводе денег
        enum AccountTransferType { Source, Destination };

        /// <summary>
        /// список счетов банка
        /// </summary>
        public IList<Account> Accounts;

        /// <summary>
        /// список клиентов банка
        /// </summary>
        public IList<Client> Clients;

        /// <summary>
        /// свойство Имя банка
        /// </summary>
        public string Name
        {
            get { return _name; }
        }

        /// <summary>
        /// свойство ID банка
        /// </summary>
        public int ID
        {
            get
            {
                return _id;
            }
        }

        /// <summary>
        /// Метод: добавить деньги на счёт
        /// </summary>
        /// <param name="Acc">Счёт</param>
        /// <param name="Summ">Сумма</param>
        public void AddBalance(Account Acc, double Summ) { return; }

        /// <summary>
        /// Метод: удалить деньги со счёта
        /// </summary>
        /// <param name="Acc">Счёт</param>
        /// <param name="Summ">Сумма</param>
        public void WithDraw(Account Acc, double Summ) { return; }

        /// <summary>
        /// Метод: добавить нового клиента
        /// </summary>
        /// <returns>Клиент</returns>
        public Client CreateClient(ClientInfo clientInfo)
        {
            Client newClient = new Client(clientInfo, this);
            Clients.Add(newClient);
            return newClient;
        }

        /// <summary>
        /// Метод: создать новый счёт в банке
        /// </summary>
        /// <param name="client"></param>
        /// <returns>Счёт</returns>
        public Account CreateAccount(Client client, DateTime expireDate, double initBalance)
        {           
            Account newAccount = new Account(this, client, expireDate, initBalance);
            Accounts.Add(newAccount);
            return newAccount;
        }

        /// <summary>
        /// Метод: инициализация банка
        /// </summary>
        private void Init()
        {
            // создаём список для хранения клиентов
            Clients = new List<Client>();
            // создаём список для хранения счетов
            Accounts = new List<Account>();
            // установим ID банка
            _id++;
        }

        // конструктор банка по умолчанию
        public Bank()
        {
            this._name = "NoName";
            Init();
        }

        /// <summary>
        /// Метод: перевод денег с одного счёта на другой
        /// </summary>
        public void Transfer(double amount, Account fromAccount, Account toAccount)
        {
          
            // если счёт не найден - перевод денег невозможен
            if (fromAccount == null)
            {
                throw new Exception("Счёт-источник не найден");
            }

            // если счёт не найден - перевод денег невозможен
            if (toAccount == null)
            {
                throw new Exception("Счёт-приёмник не найден");
            }

            // Если операция по снятию денег со счёта прошла успешно
            fromAccount.MoneyDec(amount);
                // добавим снятые деньги на счёт-приёмник
            toAccount.MoneyInc(amount);
            
        }

        /// <summary>
        /// конструктор банка с именем
        /// </summary>
        /// <param name="Name">Имя счёта</param>
        public Bank(string Name)
        {
            Init();
            this._name = Name;
        }
    }
}
